package commons.data;

import java.util.ArrayList;


// Représente un ensemble de zones d'un objet, sachant que tout objet fait forcément partie de la zone principale
public class Zones {

	private ArrayList<Zone> vZone;
	public ArrayList<Zone> getVZones() {return vZone;}

	public Zones() {
		//vZone = new ArrayList<Zone>();
		// on ne créée que si nécessaire, pour éviter une grosse conso mémoire pour les junctions
		//  (seuls les node on besoin de zone)
	}
	
	public int getNbZones() {
		if (vZone == null) return 1;
		return 1 + vZone.size();
	}


	public void addZone(Zone zone) {
		// Cette optimisation permet de ne créer un vecteur de zone que s'il y a une
		//  réelle zone (optim memoire)
		if (zone==Zone.zonePrincipale) return;
		
		if (vZone==null) vZone = new ArrayList<Zone>();
		if (isOfZone(zone))
			vZone=vZone;
		assert (isOfZone(zone)==false);
		vZone.add(zone);
	}


	public boolean isOfZone(Zone zone) {
		if (zone==Zone.zonePrincipale)
			return true;
		if (vZone==null)
			return false;
		for (Zone z : vZone)
			if (z==zone || z.equals(zone))
				return true;
		return false;
	}

	public String toString() {
		String res = "";
		res += "Zone(s) :\n";
		res += Zone.zonePrincipale.name + "\n";
		if (vZone!=null)
			for (Zone z : vZone)
				res += z.name + "\n";
		return res;
	}


	public boolean equals (Zones zones) {
		// Qques pre-tests simple, car le test complet est quadratique si beaucoup de zones imbriquées ...
		if (this == zones)
			return true;

		int nbZones_this = this.getNbZones();
		if (nbZones_this != zones.getNbZones())
			return false;

		// A partir d'ici, meme nb de zones
		if (nbZones_this == 1)
			return true; // on est sur 2 zones principales

		if (nbZones_this == 2)
			return vZone.get(0).equals(zones.vZone.get(0));

		// les 3 tests précédents auront réglé la quasi-majorité des cas, mintenant, test complet
		// this doit etre avoir les memes zones que l'argument
		for (Zone z : zones.vZone) {
			if (!this.isOfZone(z))
				return false;
		}
		return true;
	}
}
